{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "404c3ac7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "6be6068a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%autoreload\n",
    "import torch\n",
    "from thop import profile\n",
    "from thop import clever_format\n",
    "\n",
    "result_dict = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f4a1c86",
   "metadata": {},
   "source": [
    "# 4LIF_CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "6ae219a0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SCNN_Model_4LIF(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (conv1): Conv2d(1, 40, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (conv2): Conv2d(40, 40, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (fc): Linear(in_features=3240, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.\n",
      "torch.Size([1, 3240])\n",
      "unoptimized ops (use thop pkg): 77.145M MACs\n",
      "[spike op:] add: 79.08835 M ADDops; mul: 80.0604 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.fourLIF_conv import SCNN_Model_4LIF\n",
    "model = SCNN_Model_4LIF(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SCNN_Model_4LIF'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a893dac",
   "metadata": {},
   "source": [
    "# 4LIF-FC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "08ad9ace",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SNN_Model_4LIF(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (fc1): Linear(in_features=1296, out_features=2048, bias=True)\n",
      "  (fc): Linear(in_features=2048, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "unoptimized ops (use thop pkg): 39.917M MACs\n",
      "[spike op:] add: 39.97691 M ADDops; mul: 40.00768 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.fourLIF_fc import SNN_Model_4LIF\n",
    "\n",
    "model = SNN_Model_4LIF(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SNN_Model_4LIF'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c255972",
   "metadata": {},
   "source": [
    "# LIF-CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "d8d7a3ab",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SCNN_Model_LIF(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (conv1): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (conv2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (fc): Linear(in_features=810, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.\n",
      "unoptimized ops (use thop pkg): 6.165M MACs\n",
      "[spike op:] add: 6.65005 M ADDops; mul: 6.8931 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.LIF_conv import SCNN_Model_LIF\n",
    "\n",
    "model = SCNN_Model_LIF(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SCNN_Model_LIF'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b95500b3",
   "metadata": {},
   "source": [
    "# LIF-FC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "373903b0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SNN_Model_LIF(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (fc1): Linear(in_features=1296, out_features=512, bias=True)\n",
      "  (fc): Linear(in_features=512, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "unoptimized ops (use thop pkg): 9.980M MACs\n",
      "[spike op:] add: 9.99419 M ADDops; mul: 10.00192 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.LIF_fc import SNN_Model_LIF\n",
    "\n",
    "model = SNN_Model_LIF(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SNN_Model_LIF'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35a90354",
   "metadata": {},
   "source": [
    "# HH_conv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "dfb4757d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SCNN_Model_HH(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (fc1): HH_neuron(\n",
      "    (conv): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (fc2): HH_neuron(\n",
      "    (conv): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (fc_output): Linear(in_features=810, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.\n",
      "unoptimized ops (use thop pkg): 6.165M MACs\n",
      "[spike op:] add: 9.80905 M ADDops; mul: 11.7531 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.HH_conv import SCNN_Model_HH\n",
    "\n",
    "model = SCNN_Model_HH(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SCNN_Model_HH'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a930cbf3",
   "metadata": {},
   "source": [
    "# HH_fc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "abe198d4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SNN_Model_HH(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (fc1): HH_neuron(\n",
      "    (fc): Linear(in_features=1296, out_features=512, bias=True)\n",
      "  )\n",
      "  (fc_output): Linear(in_features=512, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "unoptimized ops (use thop pkg): 9.980M MACs\n",
      "[spike op:] add: 10.09403 M ADDops; mul: 10.15552 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.HH_fc import SNN_Model_HH\n",
    "\n",
    "model = SNN_Model_HH(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SNN_Model_HH'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92fe2d32",
   "metadata": {},
   "source": [
    "# LIF_HH_CONV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "b5de32b1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SCNN_Model_LIF_hh(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (lif_fc): Linear(in_features=3, out_features=1, bias=True)\n",
      "  (lif_4_1): lif_hh(\n",
      "    (conv1): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (conv2): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (conv3): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (lif_4_2): lif_hh(\n",
      "    (conv1): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (conv2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (conv3): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (fc): Linear(in_features=3240, out_features=50, bias=True)\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.\n",
      "unoptimized ops (use thop pkg): 19.263M MACs\n",
      "[spike op:] add: 21.20575 M ADDops; mul: 22.032 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from thop import profile\n",
    "from thop import clever_format\n",
    "from models.LIF_hh_conv import SCNN_Model_LIF_hh\n",
    "\n",
    "model = SCNN_Model_LIF_hh(2,win=15)\n",
    "inputs = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(inputs,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SCNN_Model_LIF_hh'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eec43f51",
   "metadata": {},
   "source": [
    "# LIF_HH_FC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "77cef2b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SNN_Model_LIF_hh(\n",
      "  (task_0): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (task_1): Linear(in_features=50, out_features=10, bias=True)\n",
      "  (fc_output): Linear(in_features=2048, out_features=50, bias=True)\n",
      "  (lif_4): lif_hh(\n",
      "    (fc1): Linear(in_features=1296, out_features=512, bias=True)\n",
      "    (fc2): Linear(in_features=1296, out_features=512, bias=True)\n",
      "    (fc3): Linear(in_features=1296, out_features=512, bias=True)\n",
      "    (lif_fc): Linear(in_features=3, out_features=1, bias=True)\n",
      "  )\n",
      ")\n",
      "[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.\n",
      "unoptimized ops (use thop pkg): 29.986M MACs\n",
      "[spike op:] add: 30.04667 M ADDops; mul: 30.07744 M MULops\n"
     ]
    }
   ],
   "source": [
    "%autoreload\n",
    "from models.LIF_hh_fc import SNN_Model_LIF_hh\n",
    "\n",
    "model = SNN_Model_LIF_hh(2,win=15)\n",
    "input = torch.randn(1, 1, 36, 36)\n",
    "macs, params = profile(model, inputs=(input,))\n",
    "macs, params = clever_format([macs, params], \"%.3f\")\n",
    "print('unoptimized ops (use thop pkg):',macs,'MACs')\n",
    "print('[spike op:] add:',model.add_op/1e6,'M ADDops; mul:',model.mul_op/1e6,'M MULops')\n",
    "result_dict['SNN_Model_LIF_hh'] = (float(model.add_op/1e6),float(model.mul_op/1e6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "a54e8415",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'SCNN_Model_4LIF': (79.08835, 80.0604), 'SNN_Model_4LIF': (39.97691, 40.00768), 'SCNN_Model_LIF': (6.65005, 6.8931), 'SNN_Model_LIF': (9.99419, 10.00192), 'SCNN_Model_HH': (9.80905, 11.7531), 'SNN_Model_HH': (10.09403, 10.15552), 'SCNN_Model_LIF_hh': (21.20575, 22.032), 'SNN_Model_LIF_hh': (30.04667, 30.07744)}\n"
     ]
    },
    {
     "data": {
      "image/png": "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zUVE6tDTTz/NyJEjGTVqFI888sgqzyf7CfTs2ZNBgwYxatQopk6dyk477bTiuVdffZX1119/xePVVluNtddem5133pmvf/3rjBgxorIFqWNqwhARkZpzxRVXMHXqVJ577jnmzp3b5DJvvvkmc+fOZfr06XTr1o1ddtmF8847b5Vl77rrLt58803+9re/ceGFF/LOO++w3Xbb8Zvf/KbSRalbSiBERKSmLFmyhF//+tccc8wxTJw4kenTp5dcrm/fvgwaNIh1112X3XbbjWuuuYZTTz2V0047jZdeeqnRsv3792fQoEGsv/76fPazn2XWrFkcdNBBHHvssSxcuLDJWN577z2OOuoo+vXrR8+ePRk3bhzPP7+y1vmaa66hd+/ezJ49m4033pgePXqw22678a9//WvFMvPmzWPChAmsscYa9OrVi0033bQuEhclECIiUlNuuukm1l13XUaMGMERRxzBtddeW/a4CN/85jdZvnw5t9xyS4vLnnzyySxatIh77723yWUmTZrEY489xq233srjjz9Or1692HvvvVmyZMmKZf73v/9x9tlnc/XVVzNnzhyWLVvGAQccQGGk56lTp/Lhhx/ywAMP8Pzzz3PRRRfRt2/fsspTy5RAiIhITbnyyis54ogjANh1113p1asXs2bNKuu1/fv3Z8CAAY1qAJqy+eabAzS57IsvvsisWbOYNm0au+yyC1tttRUzZ85k8eLFXHfddSuWW7p0KRdffDE77rgj2267LTNnzuS5557jvvvuA+Df//43O+20E1tvvTXrr78+e++9N3vvvXdZ5allSiBERKRmvPTSSzzyyCMcdthhQOgs+cUvfpErr7yy7HW4e1mDMRVqCJpadu7cuXTq1InRo0evmNfQ0MBWW23F3//+9xXzOnXqxPbbb7/i8brrrsuQIUNWLHPCCSfw/e9/n9GjR3PGGWfw1FNPlV2WWtbhrsIQEZHadeWVV7Js2TKGDRu2Yl7hQD9v3jyGDh3a7OsXLFjAu+++ywYbbNDiexUO8E0t29zNJtOMFjl58mT22msv7rjjDu69914+85nPcNppp3HWWWeVvY5apBoIERGpCUuXLmXGjBn88Ic/5JlnnlkxPfvss4wYMYKrr766xXVccMEFdOrUiQkTJrS47Pnnn09DQwPjxo0r+fzmm2/O8uXLmTNnzop5ixcv5m9/+9uK5g8It01/4oknVjx+7bXXmD9/PpttttmKeeussw5Tpkzhxhtv5JxzzmHatGktxlfrOlwNRK0MJCUiIo3dfvvtLFiwgGOOOYb+/fs3eu6QQw7h8ssv54wzzlhxd9GFCxfy1ltv8fHHH/Pyyy8zY8YMrr32Wn7yk59QvI//z3/+w1tvvcWSJUv4xz/+weWXX86dd97JzJkzaWhoKBnPRhttxIQJE/jKV77CtGnT6Nu3L6effjp9+vRZ0cQC0KVLF0488UQuvvhievbsyUknncQWW2yxIjE54YQT2Geffdh4441ZvHgxd911V6MEJK86XAJRiYGkRETyopZHhpw+fTq77bbbKskDwEEHHcSpp57Kvffey5577gnAMceE3Xj37t0ZPHgwo0aN4sEHH2SXXXZZ5fWFTos9e/ZknXXWYeedd+bJJ59k6623bjamq6++mhNPPJH99tuPjz76iB133JG77rqLnj17rlime/funH766Rx55JG89tprjBo1iptvvnlFM8fy5cs5/vjjmTdvHquvvjpjx47lggsuaN2HVEM6XAIhIiK1qbkrLTbYYINGfRKa65+QtN5665W9bCn9+vVjxowZLS43YcKEJptNLrnkkla/fy1THwgRERFJTQmEiIiIpKYEQkREpJUmTZrE+++/n3UYmVACISIiIqkpgRAREZHUlECIiIhIah0ugTCz8WY2bdGiRVmHIiIiklsdLoFw99nuPqWpkcdERESkZR0ugRAREZG200iUIiIdyOyxu1f1/cbfd39V30+qRzUQIiJSMyZNmoSZcfTRR6/y3Le+9S3MjH333bfR8snHBQ8++CBmxoIFCwC45ppr6N27d+UC74CUQIiISE0ZOnQoN9xwAx988MGKeUuXLmXmzJkMGzYsw8gkSQmEiIjUlBEjRrDRRhtx4403rph3++2306NHD8aMGVO1OB566CF22GEHevTowcCBAznppJP4+OOPVzw/ZswYjj32WE444QT69etHv379OOWUU1i+fPmKZW6++WZGjBhBz549WWONNdh11115++23q1aGSlICISIiNWfy5MlcddVVKx5fddVVfOlLX1pxi+xKe+ONN9hnn33Ydtttefrpp5k+fTrXX389p512WqPlrrvuOpYvX86cOXP45S9/ybRp07jooosAeOuttzjkkEM46qijmDt3Lg899BBHHHFEVeKvBiUQIiJScw477DCefPJJXnzxRd566y3uuusuJk2aVLX3v+yyyxg8eDCXXXYZm222Gfvuuy8/+tGPuPTSS/nwww9XLDd48GB+9rOfsemmm3LwwQdzyimn8NOf/hSA+fPn88knnzBx4kTWW289ttxyS44++mgGDhxYtXJUkhIIERGpOf369eOAAw7gqquuYsaMGYwZM6aq/R/mzp3L6NGj6dRp5WFyp5124uOPP+all15aMW/UqFGNakVGjx7NG2+8weLFi9l6660ZN24cW265JQceeCCXX3457777btXKUGlKIEREpCZ9+ctf5tprr+Wqq67iy1/+csll+vTpQ6mRhRcuXEinTp1YffXVW/Xe7t5kc0m5zSidO3fmnnvu4Z577mHEiBFMnz6djTbaiGeffbZVMdUaJRAiIlKTxo4dS7du3ViwYAH7779/yWU22WQT/v73v7NkyZJG8//yl7+w7rrr0r1791a99+abb86cOXMadYj805/+RLdu3dhwww1XzHvsscdw9xWPH330UYYMGUKfPn2AkGyMHj2a7373uzzxxBMMGTKEG264oVUx1ZoOl0DoXhgiIvlgZvz1r3/llVdeaTIROPzww+nSpQtHHnkkTz31FC+99BJXX301F110EaecckqjZZcvX84zzzzTaHruuedKrnfq1KnMnz+fqVOnMnfuXG6//XZOPfVUjjvuOHr16rViufnz53PiiSfywgsvcNNNN3Heeedx0kknASGZ+P73v88TTzzBa6+9xqxZs5g3bx6bb755O31C2epwI1G6+2xg9siRI4/JOhYRkWrL28iQLTVBNDQ08PDDD3Pqqaey3377sWjRIoYPH85Pf/pTJk+e3GjZJUuWsO222zaa179//xWDTSWtvfba3HnnnZxyyilss8029O3bl8MOO4xzzz230XJf/OIXWbZsGTvssANmxuTJk1ckEA0NDTzyyCNccsklLFy4kKFDh3LmmWdy+OGHt+ajqDmWrHrpSEaOHOlPPvlku6xr+m3Pp37NgAuPb9V75e3HLyLZmTt3LptttlnWYdStMWPGsOWWW3LppZe2+7qb23Zm9pS7j2z3N02pwzVhiIiISNspgRAREZHUOlwfCBERkfbw4IMPZh1CplQDISIiIqkpgRARqWMdtaN8nuVlmymBEBGpU507d+aTTz7JOgxJacmSJXTt2jXrMFqk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CYSIiIikpgRCREREUlMCISIiIqkpgRAREZHUlECIiIhIakogREREJDUlECIiIpKaEggRERFJTQmEiIiIpKYEQkRERFJTAiEiIiKpKYEQERGR1DpcAmFm481s2qJFi7IORUREJLc6XALh7rPdfUpDQ0PWoYiIiORWh0sgREREpO2UQIiIiEhqSiBEREQkNSUQIiIikpoSCBEREUlNCYSIiIikpgRCREREUlMCISIiIqkpgRAREZHUlECIiIhIakogREREJDUlECIiIpKaEggRERFJTQmEiIiIpKYEQkRERFJTAiEiIiKpKYEQERGR1JRAiIiISGpKIERERCQ1JRAiIiKSmhIIERERSU0JhIiIiKSmBEJERERS63AJhJmNN7NpixYtyjoUERGR3OpwCYS7z3b3KQ0NDVmHIiIiklsdLoEQERGRtlMCISIiIqkpgRAREZHUlECIiIhIakogREREJDUlECIiIpKaEggRERFJTQmEiIiIpKYEQkRERFJTAiEiIiKpKYEQERGR1JRAiIiISGpKIERERCQ1JRAiIiKSmhIIERERSU0JhIiIiKSmBEJERERSUwIhIiIiqSmBEBERkdSUQIiIiEhqSiBEREQkNSUQIiIikpoSCBEREUlNCYSIiIikpgRCREREUlMCISIiIqkpgRAREZHUlECIiIhIakogREREJDUlECIiIpKaEggRERFJTQmEiIiIpKYEQkRERFJTAiEiIiKpKYEQERGR1JRAiIiISGq5TyDM7LNm9oKZvWhmU7OOR0REpCPoknUAbWFmXYCLgd2B/wBPmtnv3f3NbCMTERGpb3mvgdge+Lu7z3P3D4HfA/tmHJOIiEjdyzSBMLNdzGyWmb1hZm5mk0osM9XMXjGzj8zsKTPbOfH0EGBe4vHrwNoVDltERKTDy7oGojfwHHACsKT4STP7AqGJ4lxgW+DPwJ1mNqywSIl1emVCFRERkYJM+0C4+x3AHQBmdk2JRb4BXOPuV8THx5vZ3sBXgdOAN4ChieXXAV5t6v3MbAowJT5838xeaEv8bbQmsCD1q6xUzlQz0pdJ5am2eiuTylPb5YH6K1MtlGfd9l5ha9RsJ0oz6wZsB5xf9NQ9wGfi/48DW5jZUMIGPQAY19Q63X0aMK39o03PzJ5095FZx9Ge6q1M9VYeqL8yqTy1r97KVG/laYusmzCasybQGXi7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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "print(result_dict)\n",
    "\n",
    "#准备数据\n",
    "\n",
    "X = np.arange(4)\n",
    "fig = plt.figure()\n",
    "#添加子图区域\n",
    "ax = fig.add_axes([0,0,1,1])\n",
    "#绘制柱状图\n",
    "\n",
    "index = []\n",
    "label = []\n",
    "count= 0\n",
    "color_dict = [[0.6980,0.2588,0.2549],\n",
    "    [0.7961,0.4314,0.4549],\n",
    "    [0.9098,0.6627,0.6510],\n",
    "    [0.1333,0.1412,0.2863],\n",
    "    [0.2549,0.2980,0.5294],\n",
    "    [0.6118,0.7020,0.8314]]\n",
    "color1 = color_dict[5]\n",
    "color2 = color_dict[0]\n",
    "for key in result_dict:\n",
    "\n",
    "    data = result_dict[key]\n",
    "    if count ==0:\n",
    "        ax.bar(count - 0.125, data[0], color = color1, width = 0.25, label = 'ADD ops')\n",
    "        ax.bar(count + 0.125, data[1], color = color2, width = 0.25, label = 'MUL ops')\n",
    "    else:\n",
    "        ax.bar(count - 0.125, data[0], color = color1, width = 0.25)\n",
    "        ax.bar(count + 0.125, data[1], color = color2, width = 0.25)\n",
    "    \n",
    "    index.append(count)\n",
    "    label.append(key)\n",
    "    count +=1\n",
    "    \n",
    "plt.xticks(index, label, rotation=30, fontsize=14)\n",
    "plt.ylim(1,100)\n",
    "plt.yticks(fontsize=14)\n",
    "plt.yscale(\"log\")\n",
    "plt.legend(fontsize=14)\n",
    "plt.ylabel(\"M FLOPs\", fontsize=17)\n",
    "plt.title(\"FLOPs\",fontsize=20,family='Arial')\n",
    "#plt.show()\n",
    "plt.savefig(\"result.svg\",bbox_inches = 'tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9a29c75c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "hlx",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  },
  "vscode": {
   "interpreter": {
    "hash": "4ebc295fc4bb810405ff19b69dfeb46bffd5126d14328725ab891517662cb3a2"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
